package com.keitaitoys.fonteditor.font;

import java.awt.Point;
import java.awt.Rectangle;

import javax.swing.event.EventListenerList;

public class Symbol implements Comparable<Symbol> {

	//////////////////////////////////////////////////////////////////////
	// Description ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	// Consts ////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	// Variables /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	protected EventListenerList listenerList = new EventListenerList();

	private char c;
	private Rectangle bounds;
	private Point offset;
	
	//////////////////////////////////////////////////////////////////////
	// Constructor ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public Symbol(char c) {
		
		this(c, new Rectangle(), new Point());
	}

	//////////////////////////////////////////////////////////////////////
	// Constructor ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public Symbol(char c, int x, int y, int width, int height, int offsetX, int offsetY) {
		
		this(c, new Rectangle(x, y, width, height), new Point(offsetX, offsetY));
	}

	//////////////////////////////////////////////////////////////////////
	// Constructor ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public Symbol(char c, Rectangle bounds, Point offset) {
		
		this.c = c;
		this.bounds = bounds;
		this.offset = offset;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public char getChar() {
		
		return c;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public Rectangle getBounds() {
		
		return bounds;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public int getBoundsX() {
		
		return bounds.x;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public int getBoundsY() {
		
		return bounds.y;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public int getBoundsWidth() {
		
		return bounds.width;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public int getBoundsHeight() {
		
		return bounds.height;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public Point getOffset() {
		
		return offset;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public int getOffsetX() {
		
		return offset.x;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public int getOffsetY() {
		
		return offset.y;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

    public boolean equals(Object obj) {

    	if(this == obj) return true;
    	
        if(obj instanceof Symbol) {
        	Symbol other = (Symbol)obj;
        	return c == other.c;
        }
        	
        return super.equals(obj);
    }

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

    public int compareTo(Symbol other) {
    	
    	return c - other.c;
    }

    //////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

    public int hashCode() {
    	
        return (int)c;
    }

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public String toString() {
		
    	StringBuffer stringBuffer = new StringBuffer();
    	
    	stringBuffer.append(getClass().getName());
    	stringBuffer.append("[");
    	stringBuffer.append("char=" + c);    	
    	stringBuffer.append(",");
    	stringBuffer.append("offset=" + offset);    	
    	stringBuffer.append(",");
    	stringBuffer.append("bounds=" + bounds);    	
    	stringBuffer.append("]");    	

    	return stringBuffer.toString();
	}
}